package org.example.tomcat;


import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import org.example.tomcat.servlets.MyServlet;

import java.io.*;
import java.net.Socket;

//用于处理socket连接 核心步骤类
public class SocketProcessor implements Runnable{

    private final Socket clientSocket;

    public SocketProcessor(Socket clientSocket) {
        System.out.println("有新的链接");
        this.clientSocket = clientSocket;
    }

    //策略模式 要根据不同的请求类型 选择不同的servlet  至于选get还是其他 是其他管的
    @Override
    public void run() {


        // 构造servlet  请求 和 响应

        MyRequest myRequest = new MyRequest(clientSocket);
        MyResponse myResponse = new MyResponse(myRequest);


        HttpServlet servlet= getServletByUrl(myRequest.getUrl());


        try {
            servlet.service(myRequest, myResponse);
            //  这里又成了公共的了    后处理 填充响应  因为前面的方法是分开的 这里集中后处理
            myResponse.complete();//前面用的 是ServletRequest的方法 这里是子类的方法
        } catch (ServletException | IOException e) {
            throw new RuntimeException(e);
        }


        //关闭socket
        try {
            clientSocket.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }


    }


    //根据url返回对应的servlet 没有则返回默认的servlet
    private HttpServlet getServletByUrl(String url) {
        //打印url
        System.out.println("url: " + url);
        return Context.getServletByUrl(url) == null ? Context.getServletByUrl("/") : Context.getServletByUrl(url);

    }


}
